/**
 * 简单的事件系统
 * 为编辑器和插件提供发布订阅模式的事件通信
 */
import { createLogger } from '../utils/logger.js'

const logger = createLogger('EventEmitter')

export class EventEmitter {
    constructor() {
        this.events = new Map()
    }

    /**
     * 监听事件
     * @param {string} event - 事件名称
     * @param {Function} listener - 事件监听器
     */
    on(event, listener) {
        if (!this.events.has(event)) {
            this.events.set(event, [])
        }
        this.events.get(event).push(listener)
    }

    /**
     * 监听事件（一次性）
     * @param {string} event - 事件名称
     * @param {Function} listener - 事件监听器
     */
    once(event, listener) {
        const onceWrapper = (...args) => {
            listener(...args)
            this.off(event, onceWrapper)
        }
        this.on(event, onceWrapper)
    }

    /**
     * 取消监听事件
     * @param {string} event - 事件名称
     * @param {Function} listener - 事件监听器
     */
    off(event, listener) {
        if (!this.events.has(event)) return

        const listeners = this.events.get(event)
        const index = listeners.indexOf(listener)
        if (index > -1) {
            listeners.splice(index, 1)
        }

        // 如果没有监听器了，删除该事件
        if (listeners.length === 0) {
            this.events.delete(event)
        }
    }

    /**
     * 发射事件
     * @param {string} event - 事件名称
     * @param {*} data - 事件数据
     * @returns {boolean} 事件是否被处理
     */
    emit(event, data) {
        if (!this.events.has(event)) return false

        const listeners = this.events.get(event).slice() // 复制数组防止修改
        let handled = false
        
        listeners.forEach(listener => {
            try {
                const result = listener(data)
                // 如果监听器返回true，表示事件已被处理
                if (result === true) {
                    handled = true
                }
            } catch (error) {
                logger.error(`Error in event listener for ${event}:`, error)
            }
        })
        
        return handled
    }

    /**
     * 移除所有监听器
     * @param {string} event - 事件名称（可选）
     */
    removeAllListeners(event) {
        if (event) {
            this.events.delete(event)
        } else {
            this.events.clear()
        }
    }

    /**
     * 获取事件的监听器数量
     * @param {string} event - 事件名称
     * @returns {number} 监听器数量
     */
    listenerCount(event) {
        return this.events.has(event) ? this.events.get(event).length : 0
    }

    /**
     * 获取所有事件名称
     * @returns {Array} 事件名称数组
     */
    eventNames() {
        return Array.from(this.events.keys())
    }
}